home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Magnum One
/
Magnum One (Mid-American Digital) (Disc Manufacturing).iso
/
d4
/
gw_slt13.arc
/
SOURCE.ARC
/
SLTERM.PAS
< prev
next >
Wrap
Pascal/Delphi Source File
|
1990-04-01
|
8KB
|
285 lines
PROGRAM SLTerm; { for use with Joel Bergen's Global War Door }
USES
DOS, CRT, Async3, Mouse4, ANSI;
TYPE
ScreenType = ARRAY [1..4000] OF BYTE;
CONST
Version= '1.3';
Rev = 'B';
Esc = #27;
Ack = #6;
AltI = #23;
AltM = #50;
AltX = #45;
GWEnq = #255;
Alpha = ['A'..'Z','0'..'9','a'..'z','.',':','_'];
Special= ['!','"','#','$','&','%','0'..'9'];
VAR
ScreenColor : ScreenType ABSOLUTE $B800:0000; {color}
ScreenVGA : ScreenType ABSOLUTE $B800:4000; {50 line}
ScreenMono : ScreenType ABSOLUTE $B000:0000; {mono}
buf : ScreenType;
buffers : array[1..9] of ScreenType; {for screens}
Color,Local,Done : BOOLEAN;
c,ch : CHAR;
ComPort,
x,y,w,result : WORD;
Regs : REGISTERS; {DOS registers}
f : FILE; {for Maps}
f2 : TEXT; {for Capture}
i : INTEGER;
s : STRING;
Cap : STRING[80];
Store,Lines : BYTE;
PROCEDURE ExitProgram;
BEGIN
Async_Close;
CLOSE(f);
IF Mouse_Installed THEN BEGIN
RestoreMouseXY;
HideMouse;
END;
WRITELN('Shadow Lord''s Enhanced Global War Term exited.');
HALT;
END;
FUNCTION ScreenChar(x,y:word) : CHAR;
BEGIN
IF Color THEN
ScreenChar:=CHR(ScreenColor[((y-1)*80+x)*2-1])
ELSE
ScreenChar:=CHR(ScreenMono[((y-1)*80+x)*2-1]);
END;
PROCEDURE Capture;
BEGIN
ASSIGN(f2, 'SLTERM.IMG');
{$I-} APPEND(f2); {$I+}
IF IOResult<>0 THEN REWRITE(f2);
FOR Y:=1 TO 25 DO BEGIN
Cap:='';
FOR X:=1 TO 80 DO
Cap:=Cap+ScreenChar(X,Y);
WRITE(f2,Cap);
END;
CLOSE(f2);
END;
FUNCTION MouseWord(x,y,len : WORD) : STRING;
{mouse routine: gets a word pointed to by the mouse. For reading country
names, menu items, etc}
VAR
s : STRING;
i : WORD;
BEGIN
s:='';
IF ScreenChar(x,y) IN Alpha THEN BEGIN
WHILE (x>0) AND (ScreenChar(x,y) IN Alpha) DO
DEC(x);
IF (x>0) AND (ScreenChar(x,y)=' ') AND (ScreenChar(x-1,y) IN Alpha)
THEN BEGIN
DEC(x);
WHILE (x>0) AND (ScreenChar(x,y) IN Alpha) DO
DEC(x);
END;
INC(x);
FOR i:=1 TO len DO BEGIN
s:=s+ScreenChar(x,y);
INC(x);
END;
END;
MouseWord:=s;
END;
PROCEDURE Menu;
VAR
Choice: BYTE;
Chce : STRING;
i,w : Byte;
BEGIN
IF Mouse_Installed THEN HideMouse;
i:=WhereY;
w:=WhereX;
IF Color THEN Move(ScreenColor, buf, 4000)
ELSE Move(ScreenMono, buf, 4000);
IF Mouse_Installed THEN ShowMouse;
Choice:=10;
GotoXY(1,23);
TextColor(7);
Writeln(' 1:Globe 2:Africa 3:Asia 4:Australia 5:Europe 6:N.America 7:S.America ');
Writeln(' 8:Show_Player_Info 9:World_Report 0:Exit_Menu Shadow Lord''s Enhanced GWT ');
WHILE Choice>9 DO BEGIN
IF Mouse_Installed THEN BEGIN
repeat until mouseposition(x,y)=0;
if MousePosition(x,y)>0 THEN BEGIN
Chce:=MouseWord(x,y,6);
IF LENGTH(Chce)>1 THEN
IF Chce[2]=':' THEN
if (Chce<='9') OR (Chce>='9') THEN VAL(Chce[1], Choice, result);
repeat until Mouseposition(x,y)=0;
END;
END;
IF KeyPressed THEN BEGIN;
Chce:=ReadKey;
if (Chce<='9') OR (Chce>='0') THEN VAL(Chce, Choice, result);
END;
END;
IF Mouse_Installed THEN HideMouse;
IF Color THEN Move(buf, ScreenColor, 4000)
ELSE Move(buf, ScreenMono, 4000);
IF (Choice>0) AND (Lines=50) THEN
Move(Buffers[choice], ScreenVGA, 4000)
ELSE IF (Choice>0) AND (Lines=25) THEN
Move(Buffers[choice], ScreenColor, 4000);
IF (Lines=25) and (ScreenChar(31,11)='N') then begin
repeat until keypressed;
if color then move(buf, ScreenColor, 4000)
else move(buf, ScreenMono, 4000);
end;
IF Mouse_Installed THEN ShowMouse;
GotoXY(w,i);
END;
FUNCTION WaitForChar : CHAR;
VAR t : WORD;
BEGIN
t:=0;
REPEAT
INC(t);
UNTIL (t>65500) OR Async_Buffer_Check;
IF Async_Buffer_Check THEN
WaitForChar:=Async_Read
ELSE
WaitForChar:=#00;
END;
BEGIN
ASSIGN(f,FEXPAND(FSEARCH('WAR.IMG',GETENV('PATH'))));
w:=IORESULT;
{$I-} RESET(f,1); {$I+}
IF IORESULT<>0 THEN BEGIN
WRITELN('WAR.IMG not found!');
HALT;
END;
IF FileSize(f)<32000 THEN BEGIN
WRITELN('You must use one of SLTerm''s Enhanced WAR.IMGs!'^G^G);
ExitProgram;
END;
VAL(PARAMSTR(1),ComPort,result);
VAL(PARAMSTR(2),Lines,result);
IF (ComPort<1) OR (ComPort>4) THEN
BEGIN
WRITELN('USAGE: SLTERM ComPort(1-4) #Lines(25 or 50)');
CLOSE(f);
HALT;
END;
Regs.AH := $0F;
INTR($10,Regs);
IF Regs.AL=7 THEN
Color:=FALSE
ELSE
Color:=TRUE;
IF (Lines<>25) AND (Lines<>50) THEN Lines:=25; {Default to 25 Lines}
Async_CheckCTS := FALSE; {disable hardware handshaking}
Done:=NOT Async_Open(ComPort);
IF Lines=50 THEN TextMode(3+256); {50 line mode}
IF NOT Done THEN WRITELN('SLTERM Version ',Version,' active.');
IF NOT Done THEN WRITELN('Alt-X to Exit, Alt-M for Menu, Alt-I to capture screen.');
X:=1;
WHILE X<10 DO BEGIN
SEEK(f,7*4000); {set up the buffer}
BlockRead(f,buffers[X],4000);
X:=X+1;
END;
IF Mouse_Installed THEN ShowMouse;
Store:=10;
WHILE NOT Done DO BEGIN
REPEAT
c:=#00;
IF Async_Buffer_Check THEN BEGIN
c:=Async_Read;
Local:=FALSE;
END ELSE IF KEYPRESSED THEN BEGIN
ch:=READKEY;
Local:=TRUE;
IF ch<>#0 THEN
Async_Send(ch)
ELSE BEGIN
ch:=ReadKey;
IF ch=AltX THEN ExitProgram; {alt-x quits program}
IF ch=AltM THEN Menu; {alt-m calls up menu}
IF ch=AltI THEN Capture; {alt-i captures screen}
END;
END
ELSE IF Mouse_Installed AND (MousePosition(x,y)>0) AND
(MousePosition(x,y)<3) THEN BEGIN
IF MousePosition(x,y)=2 THEN
Async_Send(#13)
ELSE BEGIN
IF ScreenChar(x,y) IN Special THEN S:=Screenchar(x,y)+':'
ELSE If ScreenChar(x,y) IN Alpha THEN S:=MouseWord(x,y,5);
c:=s[1];
IF s<>''THEN BEGIN
IF S[2]=':' THEN
Async_Send(c)
ELSE BEGIN
FOR i:=1 TO 5 DO
Async_Send(s[i]);
Async_Send(#13);
END;
END;
END;
REPEAT UNTIL MousePosition(x,y)=0;
c:=#00;
END
ELSE IF Mouse_Installed AND (MousePosition(x,y)=4) THEN Menu;
IF NOT Async_Buffer_Check AND (Store<10) THEN BEGIN
IF Color THEN MOVE(ScreenColor, buffers[Store], 4000)
ELSE MOVE(ScreenMono, buffers[Store], 4000);
END;
UNTIL c<>#00;
IF Mouse_Installed THEN HideMouse;
IF (c=ESC) AND (NOT Local) THEN
BEGIN
c:=WaitForChar;
CASE c OF
GWEnq:BEGIN
Async_Send(ACK);
Async_Send(REV);
c:=WaitForChar;
IF c<>ACK THEN BEGIN
WRITELN('THIS IS AN OBSELETE VERSION OF SLTERM!'^G^G);
DELAY(5000);
END;
END;
'M':BEGIN
c:=WaitForChar;
i:=ORD(c) - ORD('1');
IF (i>=0) AND (i < (FILESIZE(f) DIV 4000)) THEN BEGIN
SEEK(f,i*4000);
Store:=i+1;
BLOCKREAD(f,buf,4000);
IF Color THEN
MOVE(buf,ScreenColor,4000)
ELSE
MOVE(buf,ScreenMono,4000);
END;
END;
'Q':Done := TRUE;
ELSE BEGIN
Display_ANSI(ESC);
Display_ANSI(c);
END;
IF ScreenChar(1,3)='~' THEN Store:=8 {player info}
ELSE IF ScreenChar(3,2)='A' THEN Store:=9; {world report}
END;
END
ELSE Display_ANSI(c);
IF Mouse_Installed THEN ShowMouse;
END;
ExitProgram;
END.